/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package parih_threads;

import java.util.Random;

/**
 *
 * @author Drak_kin
 */
public class Person extends Thread{
    public enum Status{before_arrive,arrive,wait_stri4sya, wait_strichsya_on_sofa,strishka,wait_to_pay,pay,leave}
    public Status status;
    public String name;
    public int time_arrive;
    public int time_to_end;
    private synchronized String show_time(int time){
        String out="";
        Integer hours=time/60;
        Integer mins=time%60;
        if (hours<10) out+="0";
        out+=hours.toString()+":";
        if (mins<10) out+="0";
        out+=mins.toString();
        return out;
    }
    public  Person(String num,int time){
        name=num;
        time_arrive=time;
        status= Status.before_arrive;
        time_to_end=0;
        System.out.println("Создан персонаж:"+num+" время прибытия:"+show_time(time_arrive));
    }
    public  void change_status(Semaphore chair, Semaphore sofa, Semaphore w_p){
        switch(status){
            case before_arrive:{
                if (time_arrive<=Parih_threads.time) {
                    status= Status.arrive;
                    System.out.println(show_time(Parih_threads.time)+" клиент "+name+" прибыл");
                }else break;
            }
            case arrive:{
                   try{
                        w_p.enter();
                        status= Status.wait_stri4sya;
                        System.out.println(show_time(Parih_threads.time)+" клиент "+name+" ожидает очереди");
                        
                    }catch(Exception ex){
                        status= Status.leave;
                        System.out.println(show_time(Parih_threads.time)+" клиент "+name+" покинул парихмахерскую, так как не было место для ожидания");
                    }
            }
            case wait_stri4sya:{
                    try{
                        sofa.enter();
                        w_p.leave();
                        status= Status.wait_strichsya_on_sofa;
                        System.out.println(show_time(Parih_threads.time)+" клиент "+name+" ожидает на диване");
                    }catch(Exception ex){}
                
            }
            case wait_strichsya_on_sofa:{
                   try{
                       chair.enter();
                       sofa.leave();
                       status= Status.strishka;
                       System.out.println(show_time(Parih_threads.time)+" клиент "+name+" стрижется");
                       time_to_end=Parih_threads.time+20+new Random().nextInt(20);
                   }catch(Exception ex){}
            }
            case strishka:{
                if (Parih_threads.time>=time_to_end){
                    chair.leave();
                    status= Status.leave;
                    System.out.println(show_time(Parih_threads.time)+" клиент "+name+" закончил стрижку");                    
                } else break;
            }
        }
    }
}
